package com.huanf.media.utils;


import org.springframework.beans.factory.annotation.Value;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author: 35238
 * 功能: 这个类是工具测试类，只有ffmpegpath路径是我们用得上的(已经配置到bootstrap.yml文件里)，其它路径自己根据情况改改着玩就行了
 * 时间: 2024-05-11 22:00
 */
public class Mp4VideoUtil extends VideoUtil {

    @Value("${videoprocess.ffmpegpath}")
    String ffmpegpath;//这行不能这样写，自己测试的时候，记得换成ffmpeg的具体位置，例如"D:\\ffmpeg\\ffmpeg-6.0-full_build\\bin\\ffmpeg.exe"

    String video_path = "D:\\ffmpeg\\avi格式1.avi";
    String mp4_name = "avi格式1Result.mp4";
    String mp4folder_path = "D:\\ffmpeg\\downloadPath\\";
    public Mp4VideoUtil(String ffmpegpath, String video_path, String mp4_name, String mp4folder_path){
        super(ffmpegpath);
        this.ffmpegpath = ffmpegpath;
        this.video_path = video_path;
        this.mp4_name = mp4_name;
        this.mp4folder_path = mp4folder_path;
    }
    //清除已生成的mp4
    private void clear_mp4(String mp4_path){
        //删除原来已经生成的m3u8及ts文件
        File mp4File = new File(mp4_path);
        if(mp4File.exists() && mp4File.isFile()){
            mp4File.delete();
        }
    }
    /**
     * 视频编码，生成mp4文件
     * @return 成功返回success，失败返回控制台日志
     */
    public String generateMp4(){
        //清除已生成的mp4
        clear_mp4(mp4folder_path);
        List<String> commend = new ArrayList<>();
        commend.add(ffmpegpath);
        commend.add("-i");
        commend.add(video_path);
        commend.add("-c:v");
        commend.add("libx264");
        commend.add("-y");//覆盖输出文件
        commend.add("-s");
        commend.add("1280x720");
        commend.add("-pix_fmt");
        commend.add("yuv420p");
        commend.add("-b:a");
        commend.add("63k");
        commend.add("-b:v");
        commend.add("753k");
        commend.add("-r");
        commend.add("18");
        commend.add(mp4folder_path  );
        String outstring = null;
        try {
            ProcessBuilder builder = new ProcessBuilder();
            builder.command(commend);
            //将标准输入流和错误输入流合并，通过标准输入流程读取信息
            builder.redirectErrorStream(true);
            Process p = builder.start();
            outstring = waitFor(p);

        } catch (Exception ex) {

            ex.printStackTrace();

        }
        Boolean check_video_time = this.check_video_time(video_path, mp4folder_path);
        if(!check_video_time){
            return outstring;
        }else{
            return "success";
        }
    }

    public static void main(String[] args) throws IOException {
        //ffmpeg的路径
        String ffmpegpath = "D:\\ffmpeg\\ffmpeg-6.0-full_build\\bin\\ffmpeg.exe";//ffmpeg的安装位置
        //源avi视频的路径
        String video_path = "D:\\ffmpeg\\avi格式1.avi";
        //转换后mp4文件的名称
        String mp4_name = "avi格式1Result.mp4";
        //转换后mp4文件的路径
        String mp4_path = "D:\\ffmpeg\\downloadPath\\";
        //创建工具类对象
        Mp4VideoUtil videoUtil = new Mp4VideoUtil(ffmpegpath,video_path,mp4_name,mp4_path);
        //开始视频转换，成功将返回success
        String s = videoUtil.generateMp4();
        System.out.println(s);
    }
}
